package pw.goyd.game.handler;

import org.jboss.netty.channel.ChannelHandlerContext;
import pw.goyd.game.constant.setting.Command;
import pw.goyd.game.constant.setting.ServerSetting;
import pw.goyd.game.server.Log;
import pw.goyd.protocol.model.Request;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class CommandReflect implements ServerSetting {
    //存放cmd对应的相应类名
    private static Map<Short, String> reflect;

    /**
     * 初始化映射表
     */
    /**
     static {
     init();
     }
     */

    /**
     * 初始化映射表
     */
    public static void init() {
        int c = 0;
        reflect = new HashMap<>();                                  //  新建映射表
        Field[] fields = Command.class.getFields();                 //  获取所有常量
        for (Field f : fields) {                                    //  遍历常量类型
            try {
                String name = f.getName();                          //  拿到常量名
                Short value = f.getShort(f.getName());              //  根据常量名获取常量值
                Log.getLogger().debug("CMD Init---->" + name);
                name = HANDLER + "." + (name.split("_"))[1];        //  取得映射处理对象名
                c++;
                reflect.put(value, name);                           //  加入映射表
                Log.getLogger().debug("Package---->" + name);
            } catch (IllegalArgumentException e) {
                Log.getLogger().error("IllegalArgumentException", e);
            } catch (IllegalAccessException e) {
                Log.getLogger().error("IllegalAccessException", e);

            }
        }
        Log.getLogger().info("初始化[" + c + "]条指令集完毕");
    }

    /**
     * 通过反射执行处理类
     */
    public static void handle(Short cmd, ChannelHandlerContext ctx, Request request) {
        String className;
        synchronized (reflect) {
            className = reflect.get(cmd);   //  取得处理对象路径
        }
        if (null == className || className.equals("")) {
            Log.getLogger().error("未知的CMD[" + String.format("0x%H", cmd) + "]");
        }

        try {
            @SuppressWarnings("unchecked")
            Class<Handler> classtype = (Class<Handler>) Class.forName(className);   //  拿到类
            Handler h = classtype.newInstance();                                    //  实例化
            //  置入数据
            h.setCtx(ctx);
            h.setRequest(request);
            h.handle();                                                             //  调用处理
        } catch (ClassNotFoundException e) {
            Log.getLogger().warn("找不到处理类[" + className + "] CMD[" + String.format("0x%H", cmd) + "] ", e);
        } catch (Exception e) {
            Log.getLogger().error("处理对象出错[" + className + "] CMD[" + String.format("0x%H", cmd) + "]", e);
        }

    }


}
